<?php
    /*
     * Soovides kasutajaid oma koodis erinevatele veebilehtedele ümber suunata,
     * peame natuke teadma päistest, ehk headeritest.
     * Nimelt, ükskõik, millal brauser teeb päringu serverile, teeb server
     * omakorda päringu php-s kirjutatud programmile (meie juhul). Enne 
     * igat serveri poolt kasutaja brauserile tagasi genereeritavat vastust
     * konstrueerib server brauserile saatmiseks terve hulga päiseid. 
     * Server saadab päised päritud veebilehega kaasa. Need päised annavad brauserile 
     * informatsiooni serverist järgmisena saabuva informatsiooni kohta.
     * Nii saab brauser end serverist tuleva informatsiooni töötlemiseks valmis panna.
     * 
     * 
     * Süntaks 
     * header(header information), täpsemini 
     * header(string $string [, bool $replace = true [, int $http_response_code ]] )
     * Header - php.net [WWW] http://php.net/manual/en/function.header.php (26.01.2013)
     * 
     * Näiteks, kui tahame saata pdf faili, saame öelda, et 
     * header("Content-type: application/pdf");
     * Selle info alusel saab meie brauser teha aga vajalikud ettevalmistused
     * pdf-i töötlemiseks. Võib olla saad ka ära määrata, milline aplikatsioon
     * peaks töötlema milliseid andmeid. 
     * 
     * W3Schoolsi põhjal Header - W3Schools [WWW] http://www.w3schools.com/php/func_http_header.asp (26.01.2013)
     * kui tahta brauserile öelda, et järgnevad andmed on pdf
     * failiformaadis, failil on konkreetne nimi ning lisaks sundida veel 
     * brauserit kuvama salvestuse jaoks vajalikku dialoogi, tuleb toimida nii: 
     * header("Content-Disposition:attachment;filename='downloaded.pdf'");
     * 
     * Et headereid edukalt saata, siis peavad nad olema esimesed andmed,
     * mida php serveriprogrammina kasutaja brauserisse saadab. Nii alguses, 
     * et isegi TÜHIK (v.a. tab) RIKUB HEADERI SAATMISE ÄRA!!! Mainimata ei saa jätta
     * aga asjaolu, et kood võib töötada ka siis, kui header instruktsioon asub 
     * meile tavapärases asukohas (html tagide elemendis). See oleneb aga sellest,
     * kas serverite seadistuses on selline instrument nagu "output_buffering" 
     * sisse või välja lülitatud. Kui output_buffering on välja lülitatud, võib 
     * headereid saata vaid php faili KÕIGE ALGUSES! Kui "output_buffering" on sisse
     * lülitatud, kaotame küll php töötamise kiiruses, kuid selle arvelt saame 
     * päiseid kasutada ükskõik millises koodi osas. output_bufferingi seadistust
     * saab meie serveri puhul muuta failist php.ini
     * 
     * Järgmisena saadame lihtsa veateate, et lehekülge ei leitud. Kui see instruktsioon
     * brauseris ilma talle järgneva instruktsiooni exit; abil käima lasta, siis 
     * headeri poolt viidatavat viga brauseris ei kuvata. Põhjuseks on see, et brauser küll valmistus 
     * veateate kuvamiseks, kuid kõigele vaatamata tuli brauserisse kohe aga 
     * päisele järgnev info (html-i tagid), mille põhjal teeb brauser kindlaks, et
     * leht siiski leiti.
     * leides exit käsu, võib brauser olla aga kindel, et edasi ei tule mingit informatsiooni,
     * kui aga tuleb, siis seda eiratakse.
     */
    //Nii saab lehe mitteleidmise viga kuvada 
    //header("HTTP/1.0 404 Not Found");
    //exit;

    /*
     * Vaatame endale aga kõvasti kasulikumat päise kasutamise võimalust, milleks on
     * kasutaja teistele veebilehtedele ümber suunamine. Selle jaoks on tarvilik
     * järgmise süntaksi abil väljendatav instruktsioon. Suuname enda lehe 
     * veebilehele 02-Hello_World.php, s.t. me ütleme brauserile, et selle lehe 
     * asemel vii kasutaja järgnevalt deklareeritud lehele ning seejärel instrueeri
     * kasutama exit; käsku, et mitte käima lasta koodi, mis päisele järgnes.
     * 
     * Antud juhul tuleks faili asukoht määrata serveri failipuu algsest viidast lähtuvalt.
     * See nõudis aga echo käsku, et instruktsioon $_SERVER["DOCUMENT_ROOT"]  üldse
     * oma tulemi annaks. Echo-t aga headeri funktsiooni sees rakendada ei saa. 
     * Seepärast olen kirjutanud potentsiaalselt vigase koodi, kasutades 
     * $_SERVER["DOCUMENT_ROOT"] asemel samalaadset käsku getenv("DOCUMENT_ROOT") ning
     * kutsudes eelmist funktsiooni failiavamisfunktsiooni fopen() abil välja (mis ongi potentsiaalne viga). 
     * Nii aga läks skript tööle ilma echo käsuta, mida headeri funktsioon ei aksepteeri.
     * Vaatamata pontentsiaalselt vigasele koodile, demonstreerib see headeri võimalusi.
     * 
     * (getenv("DOCUMENT_ROOT") ja $_SERVER["DOCUMENT_ROOT"] asemel oleks võinud
     * kasutada ka relatiivset failipuus viitamist (ehk öeldakse serverile, et mine 
     * käesoleva faili asukohast mõni kaust edasi/tagasi, siis peaksid leidma faili, mida otsime.
     * See poleks aga samuti hea programmeerimistava). 
     * 
     * Lehte vahetavaid header() funktsioone saab olla korraga vaid 1. 
     */
    header('Location: '. fopen(getenv("DOCUMENT_ROOT")).'/tunniylesanded/Algteadmised/02-Hello_World.php');
    exit; 
?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Päised ehk headers</title>
    </head>
    <body>
        <!--SIIA JÕUDMISEKS KOMMENTEERIDA VÄLJA HEADERI OSAD
        Näide, kuidas linkidesse pandud meetodid echo abil linkidele klikates
        eri URL-e väljastavad. Erinevad väljastamised on ilmselt põhjustatud sellest
        et ilma echo abita ei lasta instruktsioone $_SERVER["DOCUMENT_ROOT"] puhul
        massiivist infot küsides instruktsioone otseselt käima. Analoogiliselt ka 
        ilma echo käsuta getenv() funktsiooni puhul-->
        <a href="<?php $_SERVER["DOCUMENT_ROOT"] ?>">klikka ilma echo'ta</a><br/>
        <a href="<?php echo $_SERVER["DOCUMENT_ROOT"] ?>">klikka echo'ga</a><br/>
        <a href="<?php getenv("DOCUMENT_ROOT") ?>">klikka getenv() echo'ta</a><br/>
        <a href="<?php echo getenv("DOCUMENT_ROOT") ?>">klikka getenv() echo'ga</a><br/>
        
    </body>
</html>
